import router from '@/router'
import store from '@/store'
router.beforeEach(async(to, from, next) => {
  const token = store.getters.token
  //    白名单
  const whiteList = ['/login', '/404', '/test']
  if (token) {
    // 有token 登录了
    if (to.path === '/login') {
      // 去登录页 跳转到首页
      next('/')
    } else {
      // 不是去登录页 放行
      // 需要获取用户信息 如果有用户信息了就不用发请求获取
      if (!store.state.user.userInfo.userId) {
        await store.dispatch('user/getUserInfo')

        // 需要在此获取到用户授权所能浏览的模块名称的数组
        const menus = store.state.user.userInfo.roles.menus
        // 调用vuex封装的方法 过滤出授权的路由对象
        const routes = await store.dispatch('permission/filterRoutes', menus)
        // vuex自带方法 添加动态路由
        // 避免由于动态页面刷新 代码重新运行 先匹配了路由 没添加动态路由
        // 就匹配到了404页面 所以404页面要在动态路由后添加
        router.addRoutes([
          ...routes,
          { path: '*', redirect: '/404', hidden: true }
        ])
        // 刷新时 还没添加动态路由就匹配了页面 就会跳到空白页面
        // 在这里要手动设置跳转的路径是想要去的路径
        next(to.path)
        // 不让继续运行 否则死循环了
        return

        // 退出时 不会自动清除 登录其他未授权的账号还能手动在url上输入模块进入
        // vuex中封装的登出调用方法清除
      }
      next()
    }
  } else {
    // 没token  没登录
    if (whiteList.indexOf(to.path) === -1) {
      // 不是去白名单 去登录
      next('/login')
    } else {
      // 去白名单 放行
      next()
    }
  }
})
